/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #7
 * Fecha de Entrega: Sábado 8 de Octubre de 2011
 */

/**
 * Driver que permite ingresar cadenas y analizarlas.
 * @author José Antonio Bagur - 10275
 */

// SE IMPORTAN LOS PAQUETES A UTILIZAR EN EL DRIVER
import java.util.*;
    
public class HuffmanMain {
    
    
    public static void main(String args[]) { 
        
        
        Scanner input = new Scanner(System.in).useDelimiter("");
        List frequency = new SinglyLinkedList();
        
        System.out.println(" |  --------------------------- | ");
        System.out.println(" |  ANÁLISIS HUFFMAN DE CADENAS | ");
        System.out.println(" |  --------------------------- | ");
        System.out.println("\n");
        System.out.print(" - Ingrese la cadena que desea analizar (PRESIONE <ENTER> PARA INCIAR EL ANÁLISIS): ");
        
        while (input.hasNext()) {
            char c = input.next().charAt(0);
            if (c == '\n') 
                break;
            HuffmanLeaf query = new HuffmanLeaf(c);
            HuffmanLeaf item = (HuffmanLeaf)frequency.remove(query);
            if (item == null) {        
                frequency.addFirst(query);
            } else {                 
                item.frecuencia++;
                frequency.addFirst(item);
            }
        }

        Iterator li = frequency.iterator();
        PriorityQueue trees = new PriorityVector();
        
        while (li.hasNext()) {
            trees.add(new HuffmanTree((HuffmanLeaf)li.next()));
        }

        while (trees.size() > 1) {
            HuffmanTree smallest = (HuffmanTree)trees.remove();
            HuffmanTree small = (HuffmanTree)trees.remove();
            trees.add(new HuffmanTree(smallest,small));
        }
        
        HuffmanTree encoding = (HuffmanTree)trees.remove();
        System.out.println("\n");
        System.out.println(" |  RESULTADOS DEL ANÁLISIS | ");
        System.out.println("\n");
        encoding.print();
    }
    
}   // FIN DEL DRIVER
